#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define MAXLINE 80   // 设置缓冲区的大小
#define SERV_PORT 6666  // 端口号

int main(void)
{
	struct sockaddr_in servaddr, cliaddr;
	socklen_t cliaddr_len;
	int listenfd, connfd;
	char buf[MAXLINE];
	char str[INET_ADDRSTRLEN];
	int i, n;

	listenfd = socket(AF_INET, SOCK_STREAM, 0);  // 调用socket函数，创建一个套接字，用来绑定和监听连接

	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family = AF_INET;  // 选用ip地址的类型
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 端口号转换成网络字节序
	servaddr.sin_port = htons(SERV_PORT); // 将IP转换成网络字节序

	bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));  // 绑定套接字
	listen(listenfd, 20); // 监听连接 设置同时和客户端建立连接的数量

	printf("Accepting connections ...\n");
	while (1) {
		cliaddr_len = sizeof(cliaddr);
		connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);  // 这个函数会阻塞当前进程，等待数据传输
		printf("connections 1 %s",connfd)
		n = read(connfd, buf, MAXLINE);
		printf("received from %s at PORT %d\n",
		inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)),
		ntohs(cliaddr.sin_port));
		for (i = 0; i < n; i++)
			buf[i] = toupper(buf[i]);
		write(connfd, buf, n);
	}
	close(listenfd);
	close(connfd);
	return 0;
}